package cliente;
import java.util.ArrayList;
import java.util.Date;

import Gestores.Gestores;
import base_de_dados.Entidade;
import base_de_dados.GestorBD;

import produto.Produto;

public class Reserva implements Entidade{
    private Cliente cliente;
    private Date data;
    private Date reserva_para_data;
    private int id;
    private Factura factura;

	public Reserva(int id, Cliente cliente, Date reserva_para_data, Factura factura) {
		this(id, cliente, reserva_para_data);
		if(!factura.isTipo_fornecedor() && factura.getCliente().equals(cliente)){
			this.factura = factura;
		}
	}
	
	public Reserva(int id, Cliente cliente, Date reserva_para_data) {
		super();
		this.cliente = cliente;
		this.reserva_para_data = reserva_para_data;
		this.data = new Date();
		this.factura = new Factura(-1, cliente, false);
		this.factura.setId(Gestores.getGestor_bd().insert(factura));
		this.id = id;
	}

	/**
	 * @return the cliente
	 */
	public Cliente getCliente() {
		return cliente;
	}

	/**
	 * @param cliente the cliente to set
	 */
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
		this.factura.setCliente(cliente);
	}

	/**
	 * @return the reserva_para_data
	 */
	public Date getReserva_para_data() {
		return reserva_para_data;
	}

	/**
	 * @param reserva_para_data the reserva_para_data to set
	 */
	public void setReserva_para_data(Date reserva_para_data) {
		this.reserva_para_data = reserva_para_data;
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the data
	 */
	public Date getData() {
		return data;
	}

	/**
	 * @return the factura
	 */
	public Factura getFactura() {
		return factura;
	}

	/**
	 * @return
	 * @see cliente.Factura#isTipo_fornecedor()
	 */
	public boolean isTipo_fornecedor() {
		return factura.isTipo_fornecedor();
	}

	/**
	 * @return
	 * @see cliente.Factura#isAnulada()
	 */
	public boolean isAnulada() {
		return factura.isAnulada();
	}

	/**
	 * @return
	 * @see cliente.Factura#isPaga()
	 */
	public boolean isPaga() {
		return factura.isPaga();
	}

	/**
	 * @param paga
	 * @see cliente.Factura#setPaga(boolean)
	 */
	public void setPaga(boolean paga) {
		factura.setPaga(paga);
	}

	/**
	 * @return
	 * @see cliente.Factura#isEntregue()
	 */
	public boolean isEntregue() {
		return factura.isEntregue();
	}

	/**
	 * @param produto
	 * @param quantidade
	 * @return
	 * @see cliente.Factura#adicionarProduto(produto.Produto, double)
	 */
	public boolean adicionarProduto(Produto produto, double quantidade) {
		return factura.adicionarProduto(produto, quantidade);
	}

	/**
	 * @param produto
	 * @param quantidade
	 * @return
	 * @see cliente.Factura#remover(produto.Produto, double)
	 */
	public boolean remover(Produto produto, double quantidade) {
		return factura.remover(produto, quantidade);
	}

	/**
	 * @param produto
	 * @return
	 * @see cliente.Factura#removerProduto(produto.Produto)
	 */
	public boolean removerProduto(Produto produto) {
		return factura.removerProduto(produto);
	}

	/**
	 * @return
	 * @see cliente.Factura#totalFactura()
	 */
	public double totalFactura() {
		return factura.totalFactura();
	}

	/**
	 * @param p
	 * @return
	 * @see cliente.Factura#contains(produto.Produto)
	 */
	public boolean contains(Produto p) {
		return factura.contains(p);
	}

	/**
	 * @return
	 * @see cliente.Factura#size()
	 */
	public int size() {
		return factura.size();
	}

	/**
	 * 
	 * @see cliente.Factura#clear()
	 */
	public void clear() {
		factura.clear();
	}
	
	protected void setAnulada(boolean anulada) {
		this.factura.setAnulada(anulada);
	}
	
	protected void setEntregue(boolean entregue) {
		this.factura.setEntregue(entregue);
	}

	@Override
	public ArrayList<Object> getListaValores() {
	    ArrayList<Object> list = new ArrayList<Object>();
		list.add(cliente.getId());
		list.add(data);
		list.add(reserva_para_data);
		list.add(factura.getId());
		return list;
	}

	@Override
	public boolean update() {
		GestorBD bd = Gestores.getGestor_bd();
		if(bd != null){
			bd.update(this);
			boolean result = this.factura.update() && this.cliente.update();
			return result;
		}
		return false;
	}

	@Override
	public boolean remover() {
		GestorBD bd = Gestores.getGestor_bd();
		
		if(bd != null){
			bd.remove(this);
			this.factura.remover();
			return true;
		}
		return false;
	}

	@Override
	public ArrayList<String> getListaParametros() {
		ArrayList<String> list = new ArrayList<String>();
		list.add("cliente");
		list.add("data");
		list.add("reserva_para_data");
		list.add("factura");
		return list;
	}

	@Override
	public String getSearchString() {
		String search = "";
		if(cliente != null){
			search += "cliente = " + cliente.getId();
		}else{
			search += "cliente >= " + 0;
		}	
		if(reserva_para_data != null){
			search += " AND reserva_para_data = '" + reserva_para_data + "'";
		}else{
			search += " AND reserva_para_data LIKE '%" + "" + "%'";
		}
		if(factura != null){
			search += " AND factura = " + factura.getId();
		}else{
			search += " AND factura >= " + 0;
		}	
		return search;
	}

}
